home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr11 / ddj9304.zip / OS2WPS.ZIP / SPREAD.C < prev    next >
INI File  |  1993-03-04  |  13KB  |  309 lines

  1. [LISTING ONE]
  2.  
  3. // spread.c -- a sample WPS application
  4.  
  5. #define  INCL_WIN
  6. #define  INCL_GPI
  7. #include <os2.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include "spread.h"
  11.  
  12. #define WM_INIT WM_USER
  13.  
  14. // Internal function prototypes
  15. int main ( int argc, char *argv[] );
  16. BOOL savefile ( PSZ szFname, LONG alValues[] );
  17. BOOL openfile ( PSZ szFname, LONG alValues[] );
  18. BOOL settype ( HFILE hf, PSZ pszType );
  19. MRESULT EXPENTRY ValueDlgProc ( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 );
  20. MRESULT EXPENTRY ClientWinProc ( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
  21. // global variables
  22.     HAB  hab;               // Anchor block handle
  23. int main ( int argc, char *argv[] )
  24. {
  25.     HMQ  hmq;               // Message queue handle
  26.     HWND hwndFrame;         // Frame window handle
  27.     HWND hwndClient;        // Client window handle
  28.     QMSG qmsg;              // Message from queue
  29.     ULONG flCreate;         // Window creation flags
  30.     BOOL  fSuccess;         // return from API
  31.     hab = WinInitialize ( 0 );
  32.     hmq = WinCreateMsgQueue ( hab, 0 );
  33.     fSuccess = WinRegisterClass (hab,"spread",ClientWinProc,CS_SIZEREDRAW,0);
  34.     flCreate = FCF_SYSMENU | FCF_SIZEBORDER | FCF_TITLEBAR |
  35.                FCF_MINMAX  | FCF_SHELLPOSITION | FCF_TASKLIST | FCF_ICON;
  36.     hwndFrame = WinCreateStdWindow ( HWND_DESKTOP, WS_VISIBLE
  37.                  , &flCreate, "spread", NULL, 0L, 0 , ID_WINDOW, &hwndClient );
  38.     if ( hwndFrame == NULLHANDLE )
  39.         DosExit ( 1, 1 );
  40.   // send the client a message passing arg count and arguments
  41.     WinSendMsg ( hwndClient, WM_INIT, MPFROMSHORT ( argc ) ,MPFROMP ( argv ));
  42.     while ( WinGetMsg ( hab, &qmsg, NULLHANDLE, 0, 0 ) != FALSE )
  43.         WinDispatchMsg  ( hab, &qmsg );
  44.     fSuccess = WinDestroyWindow ( hwndFrame );
  45.     fSuccess = WinDestroyMsgQueue ( hmq );
  46.     fSuccess = WinTerminate ( hab );
  47.     return 0;
  48. }
  49. //************************************************************
  50. MRESULT EXPENTRY ClientWinProc ( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
  51. {
  52.         BOOL    fSuccess;       // return from API
  53. static  LONG    alValues[2];    // spreadsheet values
  54. static  HWND    hwndMenu;       // popup menu handle
  55. static  CHAR    szFname[255];   // file name
  56.     switch( msg )
  57.     {
  58.         case WM_BUTTON2DOWN:
  59.             {
  60.                 POINTL  ptl;
  61.               // display a popup menu at the coordinates the user clicked
  62.                 ptl.x = SHORT1FROMMP ( mp1 );
  63.                 ptl.y = SHORT2FROMMP ( mp1 );
  64.                 WinMapWindowPoints ( hwnd, HWND_DESKTOP, &ptl, 1 );
  65.                 fSuccess = WinPopupMenu (
  66.                        HWND_DESKTOP , hwnd , hwndMenu , ptl.x , ptl.y
  67.                      , 0 , PU_KEYBOARD | PU_NONE | PU_MOUSEBUTTON1 );
  68.             }
  69.             return (MRESULT)FALSE;
  70.         case WM_CLOSE:
  71.             savefile ( szFname, alValues );
  72.             WinPostMsg( hwnd, WM_QUIT, 0L, 0L );
  73.             return (MRESULT) NULL;
  74.         case WM_COMMAND:
  75.             switch ( SHORT1FROMMP ( mp1 ) )
  76.             {
  77.                 case IDM_CHANGE:
  78.                     {
  79.                         ULONG   result;
  80.                       // display a modal dialog to let user enter in new values
  81.                         result = WinDlgBox ( HWND_DESKTOP
  82.                              , WinQueryWindow ( hwnd, QW_PARENT ), ValueDlgProc
  83.                              , NULLHANDLE , DLG_VALUES , alValues );
  84.                         if ( result == DID_OK )
  85.                             WinInvalidateRect ( hwnd, NULL, TRUE );
  86.                     }
  87.                     break;
  88.             }
  89.             return (MRESULT)NULL;
  90.         case WM_CREATE:
  91.           //load our popup menu
  92.             hwndMenu = WinLoadMenu ( HWND_DESKTOP , NULLHANDLE, ID_MENU );
  93.             return (MRESULT)FALSE;
  94.         case WM_INIT:           // user-defined message
  95.             {
  96.                 int     argc;           // argument count
  97.                 CHAR    **argv;         // input arguments
  98.                 CHAR    szTitle[255];   // titlebar text
  99.               // extract argument count and strings
  100.                 argc = SHORT1FROMMP ( mp1 );
  101.                 argv = PVOIDFROMMP  ( mp2 );
  102.               // if there were no input arguments, exit
  103.                 if ( argc < 2 )
  104.                 {
  105.                     WinMessageBox (
  106.                         HWND_DESKTOP , WinQueryWindow ( hwnd, QW_PARENT )
  107.                         , "You must specify an input file"
  108.                         , "Error", 0 , MB_OK | MB_ERROR );
  109.                     DosExit ( 1, 1 );
  110.                 }
  111.               // attempt to open input file
  112.                 strcpy ( szFname, argv[1] );
  113.                 if ( openfile ( argv[1], alValues ) == FALSE )
  114.                 {
  115.                     WinMessageBox (
  116.                              HWND_DESKTOP
  117.                             , WinQueryWindow ( hwnd, QW_PARENT ) , argv[1] 
  118.                             , "Unable to open file", 0 , MB_OK | MB_ERROR );
  119.                     DosExit ( 1, 1 );                           
  120.                 }
  121.               // update the titlebar text
  122.                 strcpy ( szTitle, "Spreadsheet  - " );
  123.                 strcat ( szTitle, szFname );
  124.                 WinSetWindowText ( WinQueryWindow ( hwnd, QW_PARENT ),szTitle);
  125.             }
  126.             return (MRESULT)NULL;
  127.         case WM_PAINT:
  128.             {
  129.                 LONG    lSuccess;       // return from API
  130.                 HPS     hps;            // cached PS
  131.                 POINTL  ptl;            // coordinates for draw
  132.                 CHAR    sz[50];         // temp string
  133.                 hps = WinBeginPaint ( hwnd , NULLHANDLE, NULL );
  134.                 fSuccess = GpiErase ( hps );
  135.               // draw the values and their sum
  136.                 ptl.x = 100; ptl.y = 125;
  137.                 _itoa ( alValues[0], sz, 10 );
  138.                 lSuccess = GpiCharStringAt ( hps, &ptl, strlen ( sz ) , sz );
  139.                 ptl.y = 100;
  140.                 _itoa ( alValues[1], sz, 10 );
  141.                 lSuccess = GpiCharStringAt ( hps, &ptl, strlen ( sz ) , sz );
  142.                 ptl.y = 75;
  143.                 lSuccess = GpiMove ( hps, &ptl );
  144.                 ptl.x = 200;
  145.                 lSuccess = GpiLine ( hps, &ptl );
  146.                 ptl.x = 100; ptl.y = 50;
  147.                 _itoa ( alValues[0] + alValues[1], sz, 10 );
  148.                 lSuccess = GpiCharStringAt ( hps, &ptl, strlen ( sz ) , sz );
  149.                 ptl.x = 50; ptl.y = 25;
  150.                 strcpy ( sz, "Press the right mouse button to change values" );
  151.                 lSuccess = GpiCharStringAt ( hps, &ptl, strlen ( sz ) , sz );
  152.                 fSuccess = WinEndPaint ( hps );
  153.             }
  154.             return (MRESULT) NULL;
  155.         default:
  156.             return
  157.                 WinDefWindowProc( hwnd, msg, mp1, mp2 );
  158.     }
  159.     return WinDefWindowProc( hwnd, msg, mp1, mp2 );
  160. }
  161. // savefile:  saves the current values to a file
  162. //      RETURNS:  TRUE if successful, FALSE if not
  163. BOOL savefile ( PSZ szFname, LONG alValues[] )
  164. {
  165.     HFILE   h;                  // file handle
  166.     ULONG   ulAction;           // action taken by OPEN
  167.     ULONG   ulActualWritten;    // count written to file
  168.     APIRET  rc;                 // return code
  169.   // open the current file
  170.     rc = DosOpen ( szFname, &h, &ulAction, 0L
  171.             , 0, OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW
  172.             , OPEN_SHARE_DENYREADWRITE | OPEN_ACCESS_READWRITE, NULL );
  173.     if ( rc != 0 )
  174.         return FALSE;
  175.   // write the two values
  176.     rc = DosWrite ( h, alValues, 8, &ulActualWritten );
  177.     if ( ( rc != 0 )  || ( ulActualWritten != 8 ) )
  178.     {
  179.         DosClose ( h );
  180.         return FALSE;
  181.     }
  182.   // write our .TYPE EA on the file
  183.     settype ( h, "XX Company Spreadsheet" );
  184.   // close the file
  185.     DosClose ( h );
  186.     return TRUE;
  187. }
  188. // openfile: reads spreadsheet values from the specified file
  189. //      RETURNS:  TRUE if successful, FALSE if not
  190. BOOL openfile ( PSZ szFname, LONG alValues[] )
  191. {
  192.     HFILE   h;                  // file handle
  193.     ULONG   ulAction;           // action taken by OPEN
  194.     ULONG   ulActualRead;       // count read from file
  195.     APIRET  rc;                 // return code
  196.   // open the file
  197.     rc = DosOpen ( szFname, &h, &ulAction, 0L , 0
  198.             , OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_FAIL_IF_NEW
  199.             , OPEN_SHARE_DENYNONE | OPEN_ACCESS_READWRITE , NULL );
  200.     if ( rc != 0 )
  201.         return FALSE;
  202.   // read the values
  203.     rc = DosRead ( h, alValues, 8, &ulActualRead );
  204.     if ( rc != 0 )
  205.     {
  206.         DosClose ( h );
  207.         return FALSE;
  208.     }
  209.   // zero length files are OK, but otherwise less than 8 bytes means bad file
  210.     if ( ulActualRead < 8 )
  211.         if ( ulActualRead != 0 )
  212.         {
  213.             DosClose ( h );
  214.             return FALSE;
  215.         }
  216.   // close the file
  217.     DosClose ( h );
  218.     return TRUE;
  219. }
  220. // settype: sets the .TYPE ea for a data file
  221. BOOL settype ( HFILE hf, PSZ pszType )
  222. {
  223. // define a .TYPE EA structure
  224. typedef struct _TYPEEALIST
  225. {
  226.     ULONG   cbList;         // length of all EAs in list
  227.     ULONG   ulNextEa;       // offset of next EA
  228.     BYTE    bFlags;         // EA flags
  229.     BYTE    cbName;         // length of name
  230.     USHORT  cbEA;           // sizeof EA
  231.     CHAR    szName[6];      // ".TYPE"
  232.     USHORT  usType;         // EA data type
  233.     USHORT  cbValue;        // sizeof value
  234.     CHAR    achValue[1];    // placeholder for EA value
  235. } TEALIST, *PTEALIST;
  236.     EAOP2       eaop;           // extended attributes structure
  237.     PTEALIST    ptea;           // points to TYPE EA list
  238.     PSZ         psz1, psz2;     // temp pointers
  239.     USHORT      cb;             // structure length
  240.     APIRET      rc;             // return from API
  241.   // allocate memory for the TYPE EA list
  242.   // -1 because the structure itself defines 1 char
  243.     cb = strlen ( pszType ) - 1   +
  244.          sizeof ( TEALIST );
  245.     ptea = (PTEALIST)malloc ( cb );
  246.   // initialize the EA structures
  247.   // fill in the EA value itself: for .TYPE it's the file type
  248.   // can't use strcpy!! (needs to add '\0')
  249.     psz1 = pszType;
  250.     psz2 = ptea->achValue;
  251.     while ( *psz1 != '\0' )
  252.         *psz2++ = *psz1++;
  253.   // fill in length of the EA value
  254.     ptea->cbValue = strlen ( pszType );
  255.   // fill type of EA value
  256.     ptea->usType = 0xfffd;            // length-preceded ASCII
  257.   // length of EA (includes value + type and length fields)
  258.     ptea->cbEA = ptea->cbValue + sizeof(ptea->usType) + sizeof (ptea->cbValue);
  259.   // fill in the EA name (it's a null terminated string so strcpy is OK)
  260.     strcpy ( ptea->szName, ".TYPE" );
  261.   // fill in EA name length
  262.     ptea->cbName = (BYTE)strlen ( ".TYPE" );
  263.   // point to the TYPE EA list structure
  264.     eaop.fpFEA2List = (PFEA2LIST)ptea;
  265.     eaop.fpGEA2List = NULL;
  266.     ptea->cbList = cb;                  // structure length
  267.     ptea->ulNextEa = 0;                 // no more EAs
  268.     ptea->bFlags = 0;                   // noncritical
  269.   // attach the .TYPE extended attribute to the file
  270.     rc = DosSetFileInfo ( hf, 2, (PBYTE)&eaop , sizeof (EAOP2) );
  271.     free ( ptea );
  272.     return (BOOL)rc;
  273. }
  274. MRESULT EXPENTRY ValueDlgProc ( HWND hwnd, ULONG msg , MPARAM mp1, MPARAM mp2 )
  275. {
  276. static  PLONG   alValues;
  277.     switch ( msg )
  278.     {
  279.         case WM_INITDLG:
  280.           // retrieve a pointer to values array
  281.             alValues = PVOIDFROMMP ( mp2 );
  282.           // write current values into entry fields
  283.             WinSetDlgItemShort ( hwnd, DLG_VALUE1, (SHORT)alValues[0], TRUE );
  284.             WinSetDlgItemShort ( hwnd, DLG_VALUE2, (SHORT)alValues[1], TRUE );
  285.           // set the focus to the first entryfield
  286.             WinSetFocus ( HWND_DESKTOP, WinWindowFromID ( hwnd, DLG_VALUE1 ) );
  287.             return (MRESULT)TRUE;
  288.         case WM_COMMAND:
  289.             switch ( SHORT1FROMMP ( mp1 ) )
  290.             {
  291.                 case DID_CANCEL:
  292.                     WinDismissDlg ( hwnd, DID_CANCEL );
  293.                     break;
  294.                 case DID_OK:
  295.                   // retrieve values from entry fields
  296.                     WinQueryDlgItemShort ( hwnd, DLG_VALUE1
  297.                             , (PSHORT)&alValues[0], TRUE );
  298.                     WinQueryDlgItemShort ( hwnd, DLG_VALUE2
  299.                             , (PSHORT)&alValues[1], TRUE );
  300.                     WinDismissDlg ( hwnd, DID_OK );
  301.             }
  302.             return (MRESULT)NULL;
  303.         default:
  304.             return
  305.                 WinDefDlgProc( hwnd, msg, mp1, mp2 );
  306.     }
  307.     return WinDefDlgProc( hwnd, msg, mp1, mp2 );
  308. }
  309.